package ejb.casacentral.service.controller;

import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;

import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import comun.casacentral.proxy.parceador.UtilsXML;
import comun.casacentral.proxy.proveedor.listado.ListadoPrecioXML;
import comun.casacentral.proxy.proveedor.listado.ProveedorListadoPrecioXML;
import comun.casacentral.proxy.proveedor.listado.RodamientoListadoPrecioXML;

import ejb.casacentral.log.CasaLogger;
import ejb.casacentral.persistence.entity.ItemListadoPrecio;
import ejb.casacentral.persistence.entity.ListadoPrecios;
import ejb.casacentral.persistence.entity.Proveedor;
import ejb.casacentral.persistence.entity.Rodamiento;
import ejb.casacentral.persistence.entity.Vigencia;

@SuppressWarnings("unchecked")
@Stateless
public class ListadoControllerBean implements ListadoController {
	
	
	@PersistenceContext(unitName="casacentral")
	private EntityManager em;
	
	@EJB
	private RodamientoController rodamientoController;
	
	@EJB
	private ProveedorController proveedorController;
	
	@EJB
	private GrupoIPController grupoIPControllerBean;
	
	@EJB
	private ServiceCall serviceCall;
	
	
	@Override
	public List<ListadoPrecios> obtenerListadoPrecios() {
		CasaLogger.log(" obteniendo entidad .... ");
		return  em.createNamedQuery("ListadoPrecios.todas").getResultList();
	}

	@Override
	public List<ListadoPrecios> obtenerListadoPreciosPorCodigos(Set<String> codigosListadoPrecios) {
		CasaLogger.log(" obteniendo entidad .... ");
		return   em.createNamedQuery("ListadoPrecios.porCodigos").setParameter("codigos", codigosListadoPrecios).getResultList();
	}
	
	@Override
	public ListadoPrecios obtenerListadoPreciosPorCodigo(String codigo) {
		CasaLogger.log(" obteniendo entidad .... ");
		return (ListadoPrecios)  em.createNamedQuery("ListadoPrecios.porCodigo").setParameter("codigo", codigo).getSingleResult();
	}
	
	
	
	@Override
	public ListadoPrecios guardarListadoPreciosPorXML(String listadoPrecioXML) {
		
		ListadoPrecios listadoPrecios = parseoListatoFromXML(listadoPrecioXML);
		
		CasaLogger.log(" persistiendo entidad .... "); em.merge(listadoPrecios);
		em.flush();
		
		return listadoPrecios;
		
	}
	
	private ListadoPrecios parseoListatoFromXML(String ListadoXML){
		
		ListadoPrecioXML listadoPrecios = null;
		UtilsXML parcer= new UtilsXML();
		
		try {
			listadoPrecios = parcer.toClase(ListadoXML, ListadoPrecioXML.class);
		} catch (FileNotFoundException e) {
			CasaLogger.log(" No se pudo parsear el listado de Precios");
			e.printStackTrace();
		}
		
		Vigencia vigencia =new Vigencia(listadoPrecios.getVigenciaDesde(), listadoPrecios.getVigenciaHasta());
		
		List<ItemListadoPrecio> rodamientos= new ArrayList<ItemListadoPrecio>();
		
		for (RodamientoListadoPrecioXML rodamiento : listadoPrecios.getItemsLP().getRodamiento() ){
		
			Rodamiento rod= rodamientoController.obtenerRodamientoPorCodigo(rodamiento.getCodigo());
			if (rod == null) //TODO ver esto ;
				rod = rodamientoController.guardarRodamiento(rodamiento);
			
			ItemListadoPrecio itemEnt= new ItemListadoPrecio();
			itemEnt.setPrecio(rodamiento.getPrecio());
			itemEnt.setRodamiento(rod);
			
			rodamientos.add(itemEnt);
		}
		
		ProveedorListadoPrecioXML provxml=listadoPrecios.getProveedor();
		Proveedor prov= proveedorController.obtenerProveedorPorCodigo(provxml.getCuit());
		
		ListadoPrecios listprecios = new ListadoPrecios(String.valueOf(listadoPrecios.getNroLista()), vigencia, rodamientos, prov);
		
		return listprecios;
		
	}
	
	@Override
	public List<ListadoPrecios> obtenerListadoPreciosDesdeProveedores() {
		List<String> listadosXML = serviceCall.obtenerListadoPrecio();
		List<ListadoPrecios> listados = new ArrayList<ListadoPrecios>();
		ListadoPrecios listado = null;
		for ( String listadoXML : listadosXML ){
			
			listado = guardarListadoPreciosPorXML(listadoXML);
			listados.add(listado);
			
		}
		
		return listados;
	}


	
	
	


}
